package com.teng.dataStructure.stack;

import java.util.Arrays;
import java.util.List;
import java.util.Stack;

/*
逆波兰表达式
 */
public class PolandNotation {
    public static void main(String[] args) {
        /*
        定义逆波兰表达式：（3+4）*5-6 =》 3 4 + 5 * 6 -
        4 5 * 8 - 60 + 8 2 / +
         */
        String suffixExp = "4 5 * 8 - 60 + 8 2 / +";
        List<String> list = Arrays.asList(suffixExp.split(" "));
        Integer integer = calculate(list);
        System.out.println("运算结果为：" + integer);
    }

    /*
    具体步骤
    1、从左至右扫描，将3、4压入堆栈
    2、遇到+运算符号，因此弹出3、4，进行相加，再次将结果压入堆栈
    3、继续扫描，循环往复
    4、最后取出堆栈内剩下的数，就是我们要得结果
     */
    public static Integer calculate(List<String> list) {
        //1、创建堆栈
        Stack<Integer> stack = new Stack<>();
        for (String str : list) {
            boolean b = str.matches("\\d+");
            if (str.matches("\\d+")) { //正则表达式：//d+ 匹配数字
                stack.push(Integer.valueOf(str));
            } else {
                Integer num1 = stack.pop();
                Integer num2 = stack.pop();
                int result = cal(num1, num2, str);
                stack.push(result);
            }
        }
        return stack.pop();
    }

    /*
    判断当前输入是否是运算符
     */
    public static boolean isOper(String oper) {
        return "+".equals(oper) || "-".equals(oper) || "*".equals(oper) || "/".equals(oper);
    }

    /*
    计算方法
     */
    public static int cal (int num1, int num2, String oper) {
        if ("+".equals(oper)) {
            return num2 + num1;
        } else if ("-".equals(oper)) {
            return num2 - num1;
        } else if ("*".equals(oper)) {
            return num2 * num1;
        } else if ("/".equals(oper)) {
            return num2 / num1;
        } else {
            return -1;
        }
    }
}
